const fs = require('fs')

//========================================
// 1 stage: callback function
//========================================

// function readFile(cb) {
//   fs.readFile('./package.json', (err, data) => {
//     if (err) return cb(err)

//     cb(null, data)
//   })
// }

// readFile((err, data) => {
//   if (!err) {
//     data = JSON.parse(data)
//     console.log(data)
//   }
// })

//========================================
// 2 stage: Promise
//========================================
// function readFileAsync(path) {
//   return new Promise((resolve, reject) => {
//     fs.readFile(path, (err, data) => {
//       if (err) return reject(err)
//       resolve(data)
//     })
//   })
// }

// readFileAsync('./package.json').then(data => {
//   data = JSON.parse(data)
//   console.log(data.name)
// }).catch(err => console.log(err))


//========================================
// 3 stage: co + Generator + Promise
//========================================
// const co = require('co')
// const util = require('util')
// co(function* () {
//   let data = yield util.promisify(fs.readFile('./package.json'))
//   data = JSON.parse(data)

//   console.log(data.name)
// })


//========================================
// 4 stage: async + await 
//========================================
const readFileAsync = require('util').promisify(fs.readFile)
async function init() {
  let data = await readFileAsync('./package.json')
  data = JSON.parse(data)
  console.log(data)
}
init()